package VistaConexion;

import datos.MetodoEstadistico;
import java.sql.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Minar {

    ArrayList<String> tablas = new ArrayList<String>();
    ArrayList<String> campos = new ArrayList<String>();
    ArrayList<String> camposRelacional = new ArrayList<String>();
    ArrayList< ArrayList<String>> tablaDesnormalizada = new ArrayList<ArrayList<String>>();
    public Usuario info;
    public java.sql.Connection conexion;
    public String db = new String(); //DataBase;
    private String query;

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    public Minar() {
        info = new Usuario();
        this.query = "";
    }

    public Minar(Usuario u, String db) {
        info = u;
        this.db = db;
        this.query = "";
    }

    public void addTabla(String t) {

        for (int i = 0; i < tablas.size(); i++) {
            if (tablas.get(i).equals(t)) {
                return;
            }
        }

        this.tablas.add(t);
    }

    public void addCampo(String c) {
        this.campos.add(c);
    }

    public void addCamposRelacional(String c) {
        this.camposRelacional.add(c);
    }

    public ArrayList<String> getTablas() {
        return tablas;
    }

    public ArrayList<String> getCampos() {
        return campos;
    }

    public ArrayList<String> getCamposRelacional() {
        return camposRelacional;
    }

    public ArrayList< ArrayList<String>> getTablaDesnormalizada() {
        return tablaDesnormalizada;
    }

    public ArrayList< ArrayList<String>> Desnormalizar() {



        try {
            conexion = DriverManager.getConnection(info.getUrl() + db, info.getUser(), info.getPassword());
            String queryMinable = "";

            if (query.equalsIgnoreCase("")) {
                queryMinable += "SELECT ";

                //Agrefa Campos
                for (int i = 0; i < campos.size(); i++) {
                    queryMinable += campos.get(i);
                    if (i != campos.size() - 1) {
                        queryMinable += ", ";
                    }
                }

                queryMinable += " FROM ";

                for (int i = 0; i < tablas.size(); i++) {
                    queryMinable += tablas.get(i);
                    if (i != tablas.size() - 1) {
                        queryMinable += ", ";
                    }
                }
            } else {
                queryMinable = this.query;
            }
            System.err.println(queryMinable);


            Statement createStatement = conexion.createStatement();

            ResultSet resultCampos = createStatement.executeQuery(queryMinable);

            String[] tipoDatos = new String[campos.size()];
            for (int i = 0; i < tipoDatos.length; i++) {
                tipoDatos[i] = "integer";
            }
            while (resultCampos.next()) {

                ArrayList< String> fila = new ArrayList<String>();

                for (int i = 1; i <= campos.size(); i++) {

                    if (resultCampos.getString(i) != null) {

                        fila.add(resultCampos.getString(i));

                        String valor = resultCampos.getString(i);

                        for (int a = 0; a < valor.length(); a++) {
                            char c = valor.charAt(a);
                            if (c == '-') {
                                tipoDatos[i - 1] = "date";
                            } else if (c == ',' || c == '.') {
                                tipoDatos[i - 1] = "float";
                            } else if (c < '0' || c > '9') {
                                tipoDatos[i - 1] = "string";
                            }
                        }
                    } else {
                        fila.add("null");
                    }
                }

                for (int i = 0; i < fila.size(); i++) {
                    if ("null".equals(fila.get(i))) {
                        if ("integer".equals(tipoDatos[i])) {
                            fila.set(i, "0");
                        } else if ("date".equals(tipoDatos[i])) {
                            fila.set(i, "1-1-1900");
                        } else if ("float".equals(tipoDatos[i])) {
                            fila.set(i, "0,0");
                        } else if ("string".equals(tipoDatos[i])) {
                            fila.set(i, "ninguno");
                        }
                    }
                }

                tablaDesnormalizada.add(fila);
            }

            createStatement.close();
            conexion.close();

        } catch (SQLException ex) {
            System.out.println("clase Minar: " + ex.toString());
            JOptionPane.showMessageDialog(null, "Escriba una sentencia SQL valida");
        }
        //Agregado por esteban puello y raul piñeres
        String k;
        do {
            k = JOptionPane.showInputDialog("Desea ultilizar algun tipo de relleno de BD (s/n)");
        } while (!k.equals("s") && !k.equals("n") && !k.equals("S") && !k.equals("N") && !k.equals("si") && !k.equals("no")
                && !k.equals("NO") && !k.equals("SI") && !k.equals("No") && !k.equals("Si") && !k.equals("sI") && !k.equals("nO"));
        if (k.equals("S") || k.equals("SI") || k.equals("s") || k.equals("Si") || k.equals("si") || k.equals("sI")) {
            MetodoEstadistico me;
            me = new MetodoEstadistico(tablaDesnormalizada, info, db, campos, tablas);
            tablaDesnormalizada = me.tabla;
        }
        //Se acaba el codigo agregado por esteban puello y raul piñeres
        return tablaDesnormalizada;
    }
}
